Both loading the system background and setting up the startup animation
depends on having a primary monitor, so we wait for the monitor to
appear if necessary.
Currently this is done differently in each case, once by having a hook
to recall a method when the monitor appears, and once by re-running an
idle handler.
Replace this with an async `_ensurePrimaryMonitor()` method that we can
use to await the primary monitor where needed.